package com.AdvancedDemos.Stream流操作;

import java.util.*;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class LearnStream {
    public static void main(String[] args) {
        //Stream流操作数据的形式:
        //Stream流是个流水线,可以对数据进行一系列处理,例如:过滤,限制个数...最终打包收集成指定的数据格式,诸如数组,集合...

        //好处是可以提高操作数据的性能

        //通过 集合对象名.stream()打开流

//-------------------------------------------------------
        //1.Collection集合
        ArrayList<String> list = new ArrayList<>(List.of("51fun", "李易峰", "管虎", "宁财神"));
        Stream<String> stream = list.stream();
        //Stream流打印数据的方法  forEach() ,注意:该方法执行之后,不会再获得Stream对象,也就意味着后续无法再对这个流进行处理(流关闭)
        stream.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {//s代表stream中的每一个元素
                System.out.println(s);
                //51fun
                //李易峰
                //管虎
                //宁财神
            }
        });


//-------------------------------------------------------
        //2.Map集合
        //Map集合不能直接获取Stream对象,需要转换为单列集合Collection
        //使用:
        //1.keySet()
        //2.entrySet()
        HashMap<String, String> map = new HashMap<>(Map.of("缝纫高手", "51fun", "时间刺客", "罗志祥"));
        //1.keySet()
        Set<String> keys = map.keySet();
        Stream<String> stream1 = keys.stream();//将所有键放入到流中操作
        stream1.forEach(new Consumer<String>() {
            @Override
            public void accept(String key) {
                System.out.println(key + "-" + map.get(key));
                //时间刺客-罗志祥
                //缝纫高手-51fun
            }
        });
        //2.entrySet()
        map.entrySet().stream().forEach(/*new Consumer<Map.Entry<String, String>>() {
            @Override
            public void accept(Map.Entry<String, String> entry) {
                System.out.println(entry.getKey() + "-" + entry.getValue());
            }
        }*/      //Lambda简化
                entry -> System.out.println(entry.getKey() + "-" + entry.getValue())
                //时间刺客-罗志祥
                //缝纫高手-51funs
        );

//-------------------------------------------------------
        //3.数组
        //借助数组工具类Arrays.stream(数组)  对基础类型进行了支持
        int[] arr = {1, 2, 3, 4, 5};
        IntStream stream2 = Arrays.stream(arr);//返回值是IntStream类型 Stream流对基础类型进行了支持
        Integer[] arr1 = {1, 2, 3, 4, 5};
        Stream<Integer> stream3 = Arrays.stream(arr1);//返回值是Stream<Integer>类型
        stream2.forEach(new IntConsumer() {
            @Override
            public void accept(int value) {
                System.out.print(value + " ");//1 2 3 4 5
            }
        });


        System.out.println();
        stream3.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.print(integer + " ");//1 2 3 4 5
            }
        });
        System.out.println();


        //-------------------------------------------------------
        //4.同种类型多个数据
        //使用Stream类的静态方法of(T... elements)
        Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
        //如果传递的是一个基本类型的数组,那么会把数组类型作为泛型类型,建议将基本类型数组转换为包装类类型数组 例如:int[] --- Integer[]
        int[] arrTest = {1, 2, 3, 4, 5};
        Stream<int[]> arrTest1 = Stream.of(arrTest);
        arrTest1.forEach(new Consumer<int[]>() {
            @Override
            public void accept(int[] ints) {
                System.out.println(ints[0]);
                System.out.println(ints[1]);
                System.out.println(ints[2]);
                System.out.println(ints[3]);
                System.out.println(ints[4]);
                //基本类型数组int[]被作为泛型的结果是accept函数的形参是int[] ints,这个数组中存放的就是原数组中的内容
            }
        });//使用不方便

        Integer[] arr2 = {1, 2, 3, 4, 5};//应当尽可能使用包装类类型的数组作为Stream.of()的实参来打开流
        Stream<Integer> arr21 = Stream.of(arr2);
        integerStream.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.print(integer + " ");// 1 2 3 4 5
            }
        });
        System.out.println();
    }
}
